package com.example.manage.Service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class FindService {

    private final JdbcTemplate jdbcTemplate;
    private final RedisTemplate<String, String> redisTemplate;

    public FindService(JdbcTemplate jdbcTemplate, RedisTemplate<String, String> redisTemplate) {
        this.jdbcTemplate = jdbcTemplate;
        this.redisTemplate = redisTemplate;
    }

    /**
     * 根据 userid 查询简历信息
     * @param userid 用户ID
     * @return JSON字符串数组 {"summary": "parsed_data前30字符", "resume_id": "简历ID"}
     */
    public String findResume(String userid) {
        String cacheKey = "resume:" + userid;

        // 1. 从 Redis 获取数据
        String cachedData = redisTemplate.opsForValue().get(cacheKey);
        if (cachedData != null) {
            return cachedData;
        }

        // 2. Redis 未命中，从数据库查询
        String sql = "SELECT parsed_data, resume_id , fileids FROM resumes WHERE user_id = ?";
        List<JSONObject> result = jdbcTemplate.query(sql, (rs, rowNum) -> {
            JSONObject obj = new JSONObject();
            obj.put("parsed_data", rs.getString("parsed_data"));
            obj.put("resume_id", rs.getString("resume_id"));
            obj.put("fileids", rs.getString("fileids"));
            return obj;
        }, userid);

        // 3. 数据库无结果返回空数组
        if (result.isEmpty()) {
            return "[]";
        }

        // 4. 构造返回值并截取 parsed_data 前30个字符
        JSONArray responseArray = new JSONArray();

        for (JSONObject item : result) {
            JSONObject responseItem = new JSONObject();
            String parsedData = item.getString("parsed_data");
            String resumeId = item.getString("resume_id");
            String fileids = item.getString("fileids");

            responseItem.put("summary", parsedData.length() > 30 ? parsedData.substring(0, 30) : parsedData);
            responseItem.put("resume_id", resumeId);
            responseItem.put("fileids", fileids);
            responseArray.add(responseItem);
        }

        String jsonData = responseArray.toJSONString();

        // 5. 更新 Redis 缓存，设置过期时间（如 5 分钟）
        redisTemplate.opsForValue().set(cacheKey, jsonData, 5, TimeUnit.MINUTES);

        return jsonData;
    }

    /**
     * 根据 userid 查询已完成的面试信息
     * @param userid 用户ID
     * @return JSON字符串数组 [{"interview_id": "", "summary": "", "position": ""}, ...]
     */
    public String findAllInterview(String userid) {
        String cacheKey = "interview:completed:" + userid;

        // 1. 从 Redis 获取数据
        String cachedData = redisTemplate.opsForValue().get(cacheKey);
        if (cachedData != null) {
            return cachedData;
        }

        // 2. Redis 未命中，从数据库查询 status = '已完成'
        String sql = "SELECT interview_id, summary, position , end_time FROM interviews WHERE user_id = ? AND status = '已完成'";
        List<JSONObject> result = jdbcTemplate.query(sql, (rs, rowNum) -> {
            JSONObject obj = new JSONObject();
            obj.put("interview_id", rs.getString("interview_id"));
            obj.put("summary", rs.getString("summary"));
            obj.put("position", rs.getString("position"));
            obj.put("end_time", rs.getString("end_time"));
            return obj;
        }, userid);

        // 3. 数据库无结果返回空数组
        if (result.isEmpty()) {
            return "[]";
        }

        // 4. 构造返回值并截取 summary 前30个字符
        JSONArray responseArray = new JSONArray();

        for (JSONObject item : result) {
            JSONObject responseItem = new JSONObject();
            String interviewId = item.getString("interview_id");
            String summary = item.getString("summary");
            String position = item.getString("position");
            String endTime = item.getString("end_time");

            responseItem.put("interview_id", interviewId);
            responseItem.put("summary", summary.length() > 30 ? summary.substring(0, 30) : summary);
            responseItem.put("position", position);
            responseItem.put("end_time", endTime);

            responseArray.add(responseItem);
        }

        String jsonData = responseArray.toJSONString();

        // 5. 更新 Redis 缓存，设置过期时间（如 5 分钟）
        redisTemplate.opsForValue().set(cacheKey, jsonData, 5, TimeUnit.MINUTES);

        return jsonData;
    }

    /**
     * 删除指定用户的 Redis 缓存
     * @param userid 用户ID
     * @param keyType 键类型，0 表示简历（resume），1 表示已完成面试（interview）
     */
    public void deleteRedis(String userid, int keyType) {
        String cacheKey;
        if (keyType == 0) {
            // 简历信息键
            cacheKey = "resume:" + userid;
        } else if (keyType == 1) {
            // 已完成面试信息键
            cacheKey = "interview:completed:" + userid;
        } else {
            // 不支持的 keyType
            throw new IllegalArgumentException("Invalid keyType: " + keyType);
        }

        // 删除 Redis 缓存
        redisTemplate.delete(cacheKey);
    }

    /**
     * 根据 interview_id 查询面试记录的 summary 信息，并使用 Redis 缓存
     * @param interviewId 面试记录 ID
     * @return 返回对应的 summary 字段内容，若未找到则返回 null
     */
    public String interviewResult(String interviewId) {
        String cacheKey = "interview:result:" + interviewId; // Redis 缓存键

        // 1. 从 Redis 获取数据
        String cachedData = redisTemplate.opsForValue().get(cacheKey);
        if (cachedData != null) {
            return cachedData;
        }

        // 2. Redis 未命中，从数据库查询
        String sql = "SELECT summary FROM interviews WHERE interview_id = ?";
        List<String> result = jdbcTemplate.queryForList(sql, String.class, interviewId);

        // 3. 数据库无结果返回 null
        if (result == null || result.isEmpty()) {
            return null;
        }

        String summary = result.get(0);

        // 4. 更新 Redis 缓存，设置过期时间（如 5 分钟）
        redisTemplate.opsForValue().set(cacheKey, summary, 5, TimeUnit.MINUTES);

        return summary;
    }
}
